package com.demo.atomic;

import java.util.Random;
import java.util.concurrent.atomic.LongAccumulator;

//是LongAdder的功能扩展，对于LongAdder来说，只是对每次给定的整数执行一次加法，而LongAccumulator则可以实现任意函数操作。
public class LongAccumulatorDemo {

	public static void main(String[] args) throws InterruptedException {
		//第一个参数是需要执行的二元函数(接收两个long型参数并返回long)，第二个参数是初始值。
		//要过滤最大值，因此传入Long::max函数句柄，当有数据通过accumulate方法传入LongAccumulator后，LongAccumulator会通过
		//Long::max识别最大值并且保存在内部（很可能是cell数组内，也可能是base），最后通过longValue方法对所有的cell进行Long::max操作。
		LongAccumulator acc = new LongAccumulator(Long::max, Long.MIN_VALUE);
		Thread[] ts = new Thread[1000];

		for(int i=0; i<1000; i++){
			ts[i] = new Thread(() -> {
				Random r = new Random();
				long value = r.nextLong();
				acc.accumulate(value);
			});
			ts[i].start();
		}

		for(int i=0; i<1000; i++){
			ts[i].join();
		}

		System.out.println(acc.longValue());
	}

}
